package com.topsec.erp.util;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created with IntelliJ IDEA
 * Created by huangyongqiang
 * Created with JDK：1.8.0_102
 * Date: 2018-10-23 10:04
 * 判断对象是否为空
 */

public class EmptyUtil {
    /**
     * 判断对象、对象数组、Map、List是否为空
     *
     * @param obj 对象名
     * @return 是否为空
     */
    @SuppressWarnings("rawtypes")
    public static boolean isEmpty(Object obj) {

        // 对象
        if (obj == null) {
            return true;
        }

        if ((obj instanceof CharSequence)) {
            return ((CharSequence) obj).length() == 0;
        }

        if ((obj instanceof Collection)) {
            return ((Collection) obj).isEmpty();
        }
        // Map集合
        if ((obj instanceof Map)) {
            return ((Map) obj).isEmpty();
        }
        // 对象数组
        if ((obj instanceof Object[])) {

            if (obj.getClass().isArray()) {
                return Array.getLength(obj) == 0;
            }

            Object[] object = (Object[]) obj;
            if (object.length == 0) {
                return true;
            }

            boolean empty = true;
            for (int i = 0; i < object.length; i++) {
                if (!isEmpty(object[i])) {
                    empty = false;
                    break;
                }
            }
            return empty;
        }
        // List集合
        if ((obj instanceof List)) {
            return ((List) obj).size() == 0;
        }
        // set集合
        if ((obj instanceof Set)) {
            return ((Set) obj).size() == 0;
        }
        // int数组
        if ((obj instanceof int[])) {
            if (((int[]) obj).length == 0) {
                return true;
            }
        }
        // 整型数组
        if ((obj instanceof Integer[])) {
            if (((Integer[]) obj).length == 0) {
                return true;
            }
        }
        // long数组
        if ((obj instanceof long[])) {
            if (((long[]) obj).length == 0) {
                return true;
            }
        }
        // 字符串
        if ((obj instanceof String)) {
            return ((String) obj).trim().equals("");
        }
        return false;
    }

    /**
     * 判断对象不为空
     *
     * @param obj 对象名
     * @return 是否不为空
     */
    public static boolean isNotEmpty(Object obj) {
        return !isEmpty(obj);
    }

    /**
     * 说明：对象数组中是否含有单个空对象
     *
     * @author hyq
     * @date 2019/8/23 14:51
     */
    public static boolean isOneEmpty(Object... os) {
        for (Object o : os) {
            if (isEmpty(o)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 说明：对象数组中所有对象都为空
     *
     * @author hyq
     * @date 2019/8/23 14:53
     */
    public static boolean isAllEmpty(Object... os) {
        for (Object o : os) {
            if (!isEmpty(o)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 说明：利用反射-判断对象的属性是否为空
     *
     * @param source       要校验对象实体类
     * @param excludeNames 不需要校验的属性集合
     * @author hyq
     * @date 2019/8/23 15:00
     */
    public static boolean allFieldIsNULL(Object source, List<String> excludeNames) {
        boolean flag = true;
        try {
            // 取到obj的class, 并取到所有属性
            Field[] fs = source.getClass().getDeclaredFields();
            // 遍历所有属性
            for (Field f : fs) {
                // 设置私有属性也是可以访问的
                f.setAccessible(true);
                // 1.排除不包括的属性名, 2.属性值为空, 3.属性值转换成String为""
                if (null != excludeNames) {
                    if (!excludeNames.contains(f.getName())) {
                        if ((f.get(source) == null || "".equals(f.get(source).toString()))) {
                            flag = false;
                            break;
                        }
                    }
                } else {
                    if ((f.get(source) == null || "".equals(f.get(source).toString()))) {
                        flag = false;
                        break;
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("===>>> 判断对象属性为空异常：" + e);
        }
        return flag;
    }
}
